package router

import (
	"admin-nexus-backend/internal/middleware"
	"admin-nexus-backend/internal/service"
	"admin-nexus-backend/pkg/database"
	"admin-nexus-backend/pkg/response"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

// InitRouter 初始化路由
func InitRouter(db *gorm.DB) *gin.Engine {
	r := gin.New()

	// 使用全局中间件
	r.Use(middleware.Recovery())
	r.Use(middleware.Logger())
	r.Use(middleware.CORS())

	// 初始化服务和中间件
	dataPermissionService := service.NewDataPermissionService(db)
	dataPermissionMiddleware := middleware.NewDataPermissionMiddleware(dataPermissionService)

	// 初始化权限相关服务（使用全局Redis实例）
	permissionCacheService := service.NewPermissionCacheService(database.GetRedis())
	permissionLogService := service.NewPermissionLogService(db)
	userService := service.NewUserService(db)
	userService.SetPermissionCacheService(permissionCacheService)

	// 初始化权限中间件
	permissionMiddleware := middleware.NewPermissionMiddleware(
		userService,
		permissionCacheService,
		permissionLogService,
	)

	// 初始化操作日志服务和中间件
	operationLogService := service.NewUserOperationLogService(db)
	operationLogMiddleware := middleware.NewOperationLogMiddleware(operationLogService)

	// 健康检查
	r.GET("/health", func(c *gin.Context) {
		response.SuccessWithMessage(c, "OK")
	})

	// API v1 路由组
	v1 := r.Group("/api/v1")
	{
		// 认证路由（不需要 JWT）
		SetupAuthRoutes(v1, db)

		// 需要认证的路由
		authorized := v1.Group("")
		authorized.Use(middleware.JWTAuth())
		authorized.Use(operationLogMiddleware.OperationLog()) // 应用操作日志中间件
		{
			// 基础功能模块
			SetupCityRoutes(authorized, db)       // 城市管理
			SetupAttachmentRoutes(authorized, db) // 附件管理
			SetupDictRoutes(authorized, db)       // 字典管理
			SetupResourceRoutes(authorized, db)   // 资源管理

			// 用户相关
			SetupUserInfoRoutes(authorized, db)                       // 用户信息（菜单、权限等）
			SetupUserProfileRoutes(authorized, db)                    // 个人资料管理
			SetupUserRoutes(authorized, db, dataPermissionMiddleware) // 用户管理

			// 组织管理
			SetupOrganizationRoutes(authorized, db, dataPermissionMiddleware)

			// 角色和权限管理
			SetupRoleRoutes(authorized, db)                                                                                    // 角色管理
			SetupDataPermissionRoutes(authorized, db)                                                                          // 数据权限管理
			SetupPermissionRoutes(authorized, permissionMiddleware, permissionCacheService, permissionLogService, userService) // 权限管理
		}
	}

	// 404 处理
	r.NoRoute(func(c *gin.Context) {
		response.NotFound(c, "接口不存在")
	})

	return r
}
